minMatrix.js : rotate
minMatrix.js
構文 : matIV.rotate(mat, angle, axis, dest)
引数 : mat > 元となる行列
引数 : angle > 回転させる量をラジアンで指定
引数 : axis > 回転させる際の軸を表すベクトル
引数 : dest > 演算結果を格納する行列
モデル変換における回転を行ないます。
mat には元となる行列を、
angle には回転させたい量をラジアンで、
axis には回転させる軸を指定するベクトルを三つの要素を持つ配列として渡します。
演算結果は dest に出力されます。
code:js
this.rotate = function(mat, angle, axis, dest){
var sq = Math.sqrt(axis0 * axis0 + axis1 * axis1 + axis2 * axis2);
if(!sq){return null;}
var a = axis0, b = axis1, c = axis2;
if(sq != 1){sq = 1 / sq; a *= sq; b *= sq; c *= sq;}
var d = Math.sin(angle), e = Math.cos(angle), f = 1 - e,
g = mat0, h = mat1, i = mat2, j = mat3,
k = mat4, l = mat5, m = mat6, n = mat7,
o = mat8, p = mat9, q = mat10, r = mat11,
s = a * a * f + e,
t = b * a * f + c * d,
u = c * a * f - b * d,
v = a * b * f - c * d,
w = b * b * f + e,
x = c * b * f + a * d,
y = a * c * f + b * d,
z = b * c * f - a * d,
A = c * c * f + e;
if(angle){
if(mat != dest){
dest12 = mat12; dest13 = mat13;
dest14 = mat14; dest15 = mat15;
}
} else {
dest = mat;
}
dest0 = g * s + k * t + o * u;
dest1 = h * s + l * t + p * u;
dest2 = i * s + m * t + q * u;
dest3 = j * s + n * t + r * u;
dest4 = g * v + k * w + o * x;
dest5 = h * v + l * w + p * x;
dest6 = i * v + m * w + q * x;
dest7 = j * v + n * w + r * x;
dest8 = g * y + k * z + o * A;
dest9 = h * y + l * z + p * A;
dest10 = i * y + m * z + q * A;
dest11 = j * y + n * z + r * A;
return dest;
};